package com.ms.qw.jsf;

import com.ms.qw.application.mappers.*;
import com.ms.qw.client.dto.*;
import com.ms.qw.enums.TipoClaseRacion;
import com.ms.qw.jsf.datamodel.LazyColegioModel;
import com.ms.qw.jsf.datamodel.LazyResumenDistritoAdjudicadoModel;
import com.ms.qw.jsf.util.FindCrudBeanBase;
import com.ms.qw.server.infrastructure.persistence.exception.ApplicationException;
import com.ms.support.mapper.DTOMapperService;
import org.primefaces.component.datatable.DataTable;
import org.primefaces.event.CloseEvent;
import org.primefaces.event.RowEditEvent;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.LazyDataModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.event.ActionEvent;
import java.util.*;


@ManagedBean
@Scope("session")
@Component
public class MaestroColegioJsfBean extends FindCrudBeanBase {


    private static final Logger LOG = LoggerFactory.getLogger(MaestroColegioJsfBean.class);

    @Autowired
    ColegioMapper colegioMapper;

    @Autowired
    DistritoMapper distritoMapper;

    @Autowired
    DistritoAdjudicadoMapper distritoAdjudicadoMapper;

    @Autowired
    ComiteMapper comiteMapper;

    @Autowired
    ComunMapper comunMapper;

    @Autowired
    CampanaMapper campanaMapper;

    @Autowired
    DTOMapperService mapperService;


    private ColegioFlt colegioFlt;

    private List<CampanaDTO> cmbCampana;
    private DistritoAdjudicadoDTO distritoAdjudicadoDTO;
    private List<ColegioDTO> adjudicadoDTO;
    private List<ColegioDTO> noAdjudicadoDTO;

    private List<ComiteDTO> cmbComite;

    private LazyDataModel<ColegioDTO> adjudicadoModel;
    private LazyDataModel<ColegioDTO> noAdjudicadoModel;
    private LazyDataModel<DistritoAdjudicadoDTO> resumenModel;




    @PostConstruct
    public void init() {
        initBeans();
        initListas();
    }


    private void initListas() {
        cmbComite = comiteMapper.findAll(getUser().getCodigoRegion());
        cmbCampana = campanaMapper.findActivos();
    }

    private void initBeans() {
        colegioFlt = new ColegioFlt();
        colegioFlt.setCodigoDepartamento(getUser().getCodigoRegion());
    }

    public void onSelectDetail(SelectEvent actionEvent) {
        findAdjudicados();
        findNoAdjudicados();
    }
    /*M?todos de herencia*/

    @Override
    public void setCursorTableNull() {

    }


    public List<TipoClaseRacion> getAllTipoClaseRacion() {
        TipoClaseRacion[] result= new TipoClaseRacion[3];
        result[0]=TipoClaseRacion.RACION;
        result[1]=TipoClaseRacion.PRODUCTO;
        result[2]=TipoClaseRacion.PRODUCTO_ALEJADO;
        return Arrays.asList(result);
    }

    @Override
    public void onShowEditDialog(ActionEvent actionEvent) {
        String idComponente = actionEvent.getComponent().getId();

    }


    public void cleanActionSelect(ActionEvent actionEvent) {

    }


    @Override
    public void onNewRecord(ActionEvent actionEvent) {


    }

    private void onNewRacion() {

    }


    public void initForm(ActionEvent actionEvent) {


    }

    public void adjudicar(ActionEvent actionEvent) {
        if(noAdjudicadoDTO.isEmpty()){
            throw new ApplicationException("Seleccione los colegios");
        }
        DistritoAdjudicadoDTO parametro=new DistritoAdjudicadoDTO();
        parametro.setColegioList(noAdjudicadoDTO);

        colegioMapper.adjudicarColegios(parametro);
    }

    public void noAdjudicar(ActionEvent actionEvent) {


        if(adjudicadoDTO.isEmpty()){
            throw new ApplicationException("Seleccione los colegios");
        }
        DistritoAdjudicadoDTO parametro=new DistritoAdjudicadoDTO();
        parametro.setColegioList(adjudicadoDTO);

        colegioMapper.noAdjudicarColegios(parametro);
    }


    @Override
    public void onFind(ActionEvent actionEvent) {
        String idComponente = actionEvent.getComponent().getId();
        if ("btnBuscarAlimento".equals(idComponente)) {

        } else {
            findRegistros();
        }


    }


    public List<DistritoDTO> completeDistrito(String query) {
        DistritoFlt distritoFlt= new DistritoFlt();
        distritoFlt.setCodigoDepartamento(getUser().getCodigoRegion());
        distritoFlt.setBusqueda(query);
        return distritoMapper.findAll(distritoFlt);
    }





    public void findRegistros() {
        LazyResumenDistritoAdjudicadoModel model = new LazyResumenDistritoAdjudicadoModel(distritoAdjudicadoMapper, colegioFlt);
        resumenModel= model;
    }

    public void findAdjudicados() {
        ColegioFlt colegioFltInt=new ColegioFlt();
        colegioFltInt.setDistrito(new DistritoDTO(distritoAdjudicadoDTO.getCodigoDistrito()));
        colegioFltInt.setAdjudicado("1");
        colegioFltInt.setCampana(colegioFlt.getCampana());
        colegioFltInt.setTipoClaseRacion(colegioFlt.getTipoClaseRacion());
        LazyColegioModel model = new LazyColegioModel(colegioMapper, colegioFltInt);
        adjudicadoModel= model;
    }

    public void findNoAdjudicados() {
        ColegioFlt colegioFltInt=new ColegioFlt();
        colegioFltInt.setDistrito(new DistritoDTO(distritoAdjudicadoDTO.getCodigoDistrito()));
        colegioFltInt.setAdjudicado("0");
        colegioFltInt.setCampana(colegioFlt.getCampana());
        colegioFltInt.setTipoClaseRacion(colegioFlt.getTipoClaseRacion());
        LazyColegioModel model = new LazyColegioModel(colegioMapper, colegioFltInt);
        noAdjudicadoModel= model;
    }


    @Override
    public void onClean(ActionEvent actionEvent) {
        String idComponente = actionEvent.getComponent().getId();
        initBeans();
        DataTable adjudicado= (DataTable) findComponent("dtAdjudicado");
        DataTable noAdjudicado= (DataTable) findComponent("dtAdjudicado");

        adjudicado.resetValue();
        noAdjudicado.resetValue();
    }


    @Override
    public void onPersist(ActionEvent actionEvent) {
        String idComponente = actionEvent.getComponent().getId();
        if ("cmdAceptarAlimento".equals(idComponente)) {

            successMessage = false;

        }

    }

    public boolean isSelectRow() {
        return false;
    }

    @Override
    protected void onDeleteSelect(ActionEvent actionEvent) {
        String idComponente = actionEvent.getComponent().getClientId();


    }

    public void onEditItem(RowEditEvent event) {

    }

    @Override
    public void onDelete(ActionEvent actionEvent) {

    }

    @Override
    protected void onDialogClose(CloseEvent event) {

    }


    @Override
    protected void onSelectAll(ActionEvent actionEvent) {

    }

    @Override
    protected void onUnSelectAll(ActionEvent actionEvent) {

    }

    /*Getters and Setters*/


    public ColegioFlt getColegioFlt() {
        return colegioFlt;
    }

    public void setColegioFlt(ColegioFlt colegioFlt) {
        this.colegioFlt = colegioFlt;
    }

    public List<ComiteDTO> getCmbComite() {
        return cmbComite;
    }

    public void setCmbComite(List<ComiteDTO> cmbComite) {
        this.cmbComite = cmbComite;
    }

    public LazyDataModel<ColegioDTO> getAdjudicadoModel() {
        return adjudicadoModel;
    }

    public void setAdjudicadoModel(LazyDataModel<ColegioDTO> adjudicadoModel) {
        this.adjudicadoModel = adjudicadoModel;
    }

    public LazyDataModel<ColegioDTO> getNoAdjudicadoModel() {
        return noAdjudicadoModel;
    }

    public void setNoAdjudicadoModel(LazyDataModel<ColegioDTO> noAdjudicadoModel) {
        this.noAdjudicadoModel = noAdjudicadoModel;
    }

    public LazyDataModel<DistritoAdjudicadoDTO> getResumenModel() {
        return resumenModel;
    }

    public void setResumenModel(LazyDataModel<DistritoAdjudicadoDTO> resumenModel) {
        this.resumenModel = resumenModel;
    }

    public DistritoAdjudicadoDTO getDistritoAdjudicadoDTO() {
        return distritoAdjudicadoDTO;
    }

    public void setDistritoAdjudicadoDTO(DistritoAdjudicadoDTO distritoAdjudicadoDTO) {
        this.distritoAdjudicadoDTO = distritoAdjudicadoDTO;
    }

    public List<ColegioDTO> getAdjudicadoDTO() {
        return adjudicadoDTO;
    }

    public void setAdjudicadoDTO(List<ColegioDTO> adjudicadoDTO) {
        this.adjudicadoDTO = adjudicadoDTO;
    }

    public List<ColegioDTO> getNoAdjudicadoDTO() {
        return noAdjudicadoDTO;
    }

    public void setNoAdjudicadoDTO(List<ColegioDTO> noAdjudicadoDTO) {
        this.noAdjudicadoDTO = noAdjudicadoDTO;
    }

    public List<CampanaDTO> getCmbCampana() {
        return cmbCampana;
    }

    public void setCmbCampana(List<CampanaDTO> cmbCampana) {
        this.cmbCampana = cmbCampana;
    }
}
